
class Animals{
    public String name;
    public int age;

    public void eat(){
        System.out.println("Animals::eat()");
        System.out.println(name+"正在吃饭");
    }

    public void func(){
        System.out.println("Animals::func()");
    }
    public Animals(String name,int age){
        this.name = name;
        this.age = age;
    }
}
class Cat extends Animals{

    public void eat(){
        System.out.println("Cat::eat()");
        System.out.println(name+"正在吃猫粮");
    }
    public void catchMouse(){
        System.out.println(name+"正在抓老鼠");
    }
    public Cat(String name,int age){
        super(name,age);
    }
}
class Dog extends Animals{
    public boolean silly;

    public void eat(){
        System.out.println("Dog::eat()");
        System.out.println(name+"正在吃狗粮");
    }

    public void barks(){
        System.out.println(name+"正在汪汪叫");
    }
    public Dog(String name,int age,boolean silly){
        super(name,age);
        this.silly = silly;
    }

    @Override
    public String toString() {
        return name+" "+age+" "+silly;
    }
}
public class Test {
    /**
     *  2.
     * 传子类的引用，用父类类型的引用接收
     *
     * 此时，站在function的角度上，只有一个引用animals,
     * 一个引用animals调用同一个方法eat()，
     * 因为这个引用animals指向的对象不一样，(或者可以说，因为传的参数不一样)
     * 所以调用这个方法function时，所表现的行为不一样，
     * 这种思想就叫做多态，多态是一种思想：
     * 不同对象去完成同一行为，会产生不同的状态
     */
    public static void function(Animals animals1){
        animals1.eat();
    }

    /**
     *  3. 方法返回 - 返回子类对象，会转换为父类类型
     *  被父类引用接收
     */
    public static Animals function2(){
        System.out.println("方法返回");
        return new Cat("haha",7);
    }
    public static void main(String[] args) {
        /**
         *  1. 直接赋值
         */
        Animals animals = new Dog("大黄",4,true);
        animals.func();
        animals.eat();
        System.out.println("---------------------------");
        /**
         *  2. 方法传参 - 传参一般传的引用
         *  接收参数的方法一般设置为静态方法，
         *  因为静态方法不需要new一个此类的对象就可以直接通过类名访问，
         *  且在同一个类中，类名还可以省略，就特别的方便，
         *  所以平常我们使用的方法都是带static的静态方法
         */
        Dog dog = new Dog("小黑",6,false);
        function(dog);
        Cat cat = new Cat("mimmi",5);
        function(cat);
        System.out.println("---------------------------");

        /**
         *  3.
         *   用父类引用接收
         */
        Animals animals2 = function2();

    }
}
